//适配器模式
//将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容的类能够一起工作。

#include <iostream>

// -----------对象适配器
// •Target：我们需要的目标接口。
class TargetSocket {
public:
    virtual ~TargetSocket() = default;
    virtual void socket() = 0;
};

// •Adaptee：定义一个已经存在的接口，该接口需要适配。
class OwnSocket {
public:
    virtual ~OwnSocket() = default;
    void socketA() { std::cout << "SocketType :A" << std::endl; }
};


// •Adapter：对Adaptee的接口与Target接口进行适配。
class SocketAdapter : public TargetSocket {
public:
    SocketAdapter() : m_socket(new OwnSocket()) {}
    virtual void socket() {
        if (m_socket) m_socket->socketA();
    }

    SocketAdapter(const SocketAdapter&) = delete;
    SocketAdapter& operator=(const SocketAdapter&) = delete;

private:
    OwnSocket* m_socket;
};

// -----------类 适配器
class SocketAdapter2 : public TargetSocket , OwnSocket {
public:
    virtual void socket() {
        socketA();
    }
};

int main(int argc, const char **argv) {
    TargetSocket* sock = new SocketAdapter();
    sock->socket();
    sock = new SocketAdapter();
    sock->socket();
    return 0;
}
